let timer: number = 0;
let remaining: number = 0;
let startTime: number = 0;
let paused = false;
self.onmessage = ({ data }) => {
  if (data.type === 'START') {
    remaining = data.duration; // 初始倒计时毫秒数
    startTime = performance.now(); // 记录开始时间
    paused = false;
    updateTimer();
  } else if (data.type === 'STOP') {
    paused = true;
    clearInterval(timer);
  } else if (data.type === 'CONTINUE') {
    paused = false;
    clearInterval(timer); //若连续两次发送 CONTINUE 消息，就会启动两个 setInterval 定时器, 所以需要清除上一个定时器
    updateTimer();
  }
};

/*
  （1）如果1ms间隔，浏览器也会强制最小间隔（通常4-10ms），实际可能还是还是16ms左右，1ms不会带来视觉上改进，16.7ms间隔比1ms间隔节省约94%的计算资源
  （2）使用performance.now()获取高精度时间戳
  （3）使用requestAnimationFrame自动匹配刷新率，在Web Worker中通常不可用（大多数环境不支持Worker中的RAF），在主线程里使用
*/
function updateTimer() {
  if (paused) return;

  timer = setInterval(() => {
    const now = performance.now();
    const elapsed = now - startTime; // 已经过去的时间

    const remainingTime = remaining - elapsed; //校准时间差

    if (remainingTime <= 0) {
      clearInterval(timer);
      self.postMessage({ remaining: 0 });
      return;
    }

    self.postMessage({ remaining: remainingTime });
    startTime = now; // 更新开始时间，用于误差补偿
    remaining = remainingTime
  }, 16.7); // 按60fps帧率递减,
}